Building a Family Blog With Obsidian, S3, and NextJS
For the last four years I have kept a personal journal in Obsidian. I have missed only a handful of days in that stretch. The habit works because it is private and unpolished: a place to think without an audience.
Lately I started wanting something adjacent to that habit, but not the same thing. I wanted a small place to publish weekly updates for family and friends who actually care about our week-to-week life, and I wanted a project that forced me to learn a few new tools end to end.
This post is the story of that build: a homemade blog platform where Obsidian is the CMS, S3 is the sync layer, Next.js serves a mostly static front end with incremental static regeneration, and Supabase gates access so the writing stays personal.
Why not just post on social media?
The goal was never maximum reach. These are short summaries of family life, co-written when it makes sense, and meant for people we already know.
That shaped the constraints:
- Editors who are not me. My wife needed to be able to write and edit posts without fighting developer tooling.
- A familiar writing surface. If we were going to keep it up, the authoring experience had to feel normal, not like deploying code.
- Not fully public. The content is not secret in a dramatic sense, but it is personal enough that I did not want it indexed and discoverable like a marketing site.
So I treated it like a small product: pick a CMS workflow first, then build the smallest reliable pipeline around it.
Obsidian as the CMS (and Remotely Save → S3)
We already live in Markdown for notes. Using the vault as the source of truth meant weekly posts could stay plain files, versioned by habit, with the same editing flow as the rest of our notes.
The piece that made “family-friendly editing” real was Remotely Save, an Obsidian community plugin that syncs vault contents to remote storage. In our case, that remote storage is S3: the Markdown files land in a bucket, which becomes the handoff point between writing and the site.
That split responsibilities cleanly:
- Obsidian + Remotely Save handle authoring and upload.
- The site reads structured content from storage and renders it.
Front end: Cloudflare, Backblaze, and Next.js
On the serving side I leaned on a combination of Cloudflare and Backblaze (common pairing for object storage plus CDN and edge routing) and a Next.js app for rendering.
The Next.js part was mostly straightforward once the content pipeline was clear. Where it got interesting was using incremental static regeneration so the site can stay fast and cache-friendly while still picking up new posts after sync without a full redeploy for every edit.
In other words: static enough to feel snappy, fresh enough for a weekly publishing rhythm.
Supabase for auth
Supabase is a PostgreSQL-backed SaaS platform with a strong developer experience; the piece I reached for first was authentication.
Even though this is “just” a family blog, putting it behind login was important. The posts are not classified documents, but they are not meant for random traffic either. Supabase made it practical to add email or magic-link style access without building a bespoke auth system.
That decision trades away public shareability for peace of mind, which matches the project’s intent.
Where it goes next
The stack is a little custom by design. It is fun to tinker with, and it works well enough for our household.
The next evolution I am thinking about is multi-tenancy: my sister and a few others have asked whether they could use the same kind of setup for their own weekly writing. Making the platform safe and isolated per family, without turning it into a second full-time product, is the next challenge.